package com.cq.hd.order.utils;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

/**
 * UsernameGenerator 是一个用于生成随机用户名的工具类。
 * 提供多种生成策略，包括基于姓氏和名字的组合、添加随机数字、
 * 以及使用形容词和名词的组合。
 */
public class UsernameGenerator {

    // 常见中文姓氏
    private static final String[] SURNAMES = {
            "张", "李", "王", "赵", "周", "吴", "郑", "冯", "陈", "褚",
            "蒋", "沈", "韩", "杨", "朱", "秦", "尤", "许", "何", "吕",
            "施", "张", "孔", "曹", "严", "华", "金", "魏", "陶", "姜"
    };

    // 常见中文名字（单字）
    private static final String[] GIVEN_NAMES_SINGLE = {
            "伟", "芳", "娜", "敏", "静", "丽", "强", "磊", "军", "洋",
            "勇", "艳", "杰", "娟", "涛", "明", "超", "秀英", "霞", "平"
    };

    // 常见中文名字（双字）
    private static final String[] GIVEN_NAMES_DOUBLE = {
            "伟伟", "芳芳", "娜娜", "敏敏", "静静", "丽丽", "强强", "磊磊", "军军", "洋洋",
            "勇勇", "艳艳", "杰杰", "娟娟", "涛涛", "明明", "超超", "秀英", "霞霞", "平平"
    };

    // 形容词，用于生成描述性用户名
    private static final String[] ADJECTIVES = {
            "快乐", "聪明", "勇敢", "活泼", "善良", "优雅", "阳光", "慷慨", "热情", "机智"
    };

    // 名词，用于生成描述性用户名
    private static final String[] NOUNS = {
            "购物者", "达人", "猎手", "王者", "爱好者", "专家", "先锋", "领袖", "行者", "探索者"
    };

    private static final Random RANDOM = new Random();

    /**
     * 生成指定数量的随机用户名。
     *
     * @param count 需要生成的用户名数量
     * @return 随机用户名列表
     */
    public static List<String> generateUsernames(int count) {
        List<String> usernames = new ArrayList<>();
        for (int i = 0; i < count; i++) {
            usernames.add(generateUsername());
        }
        return usernames;
    }

    /**
     * 生成一个随机用户名，基于姓氏和名字的组合。
     * 也可以选择添加随机数字以确保唯一性。
     *
     * @return 随机生成的用户名
     */
    public static String generateUsername() {
        String surname = SURNAMES[RANDOM.nextInt(SURNAMES.length)];
        String givenName;

        // 随机选择单字或双字名字
        if (RANDOM.nextBoolean()) {
            givenName = GIVEN_NAMES_SINGLE[RANDOM.nextInt(GIVEN_NAMES_SINGLE.length)];
        } else {
            givenName = GIVEN_NAMES_DOUBLE[RANDOM.nextInt(GIVEN_NAMES_DOUBLE.length)];
        }

        // 选择是否添加随机数字（50%概率）
        if (RANDOM.nextBoolean()) {
            int number = RANDOM.nextInt(1000); // 生成0-999之间的数字
            return surname + givenName + number;
        } else {
            return surname + givenName;
        }
    }

    /**
     * 生成一个随机描述性用户名，基于形容词和名词的组合。
     * 也可以选择添加随机数字以确保唯一性。
     *
     * @return 随机生成的描述性用户名
     */
    public static String generateDescriptiveUsername() {
        String adjective = ADJECTIVES[RANDOM.nextInt(ADJECTIVES.length)];
        String noun = NOUNS[RANDOM.nextInt(NOUNS.length)];

        // 选择是否添加随机数字（50%概率）
        if (RANDOM.nextBoolean()) {
            int number = RANDOM.nextInt(1000); // 生成0-999之间的数字
            return adjective + noun + number;
        } else {
            return adjective + noun;
        }
    }

    /**
     * 生成指定数量的随机描述性用户名。
     *
     * @param count 需要生成的描述性用户名数量
     * @return 随机描述性用户名列表
     */
    public static List<String> generateDescriptiveUsernames(int count) {
        List<String> usernames = new ArrayList<>();
        for (int i = 0; i < count; i++) {
            usernames.add(generateDescriptiveUsername());
        }
        return usernames;
    }

    // 主方法用于测试和演示
    public static void main(String[] args) {
        // 生成10个基于姓氏和名字的随机用户名
        List<String> usernames = generateUsernames(10);
        System.out.println("基于姓氏和名字的随机用户名:");
        usernames.forEach(System.out::println);

        // 生成10个描述性的随机用户名
        List<String> descriptiveUsernames = generateDescriptiveUsernames(10);
        System.out.println("\n描述性的随机用户名:");
        descriptiveUsernames.forEach(System.out::println);
    }
}

